#include "dma.h"
#include "usart.h"

//可以不用dma中断，dma发送完成不代表串口发送完成

void MX_DMA_Init(void) 
{
	/* DMA controller clock enable */
	__HAL_RCC_DMA1_CLK_ENABLE();
	__HAL_RCC_DMA2_CLK_ENABLE();

	/* DMA interrupt init */
	/* DMA1_Channel2_IRQn interrupt configuration */
	HAL_NVIC_SetPriority(DMA1_Channel2_IRQn, 2, 0);
	HAL_NVIC_EnableIRQ(DMA1_Channel2_IRQn);
	/* DMA1_Channel4_IRQn interrupt configuration */
	HAL_NVIC_SetPriority(DMA1_Channel4_IRQn, 2, 0);
	HAL_NVIC_EnableIRQ(DMA1_Channel4_IRQn);
	/* DMA1_Channel7_IRQn interrupt configuration */
	HAL_NVIC_SetPriority(DMA1_Channel7_IRQn, 2, 0);
	HAL_NVIC_EnableIRQ(DMA1_Channel7_IRQn);
	/* DMA2_Channel4_5_IRQn interrupt configuration */
	HAL_NVIC_SetPriority(DMA2_Channel4_5_IRQn, 2, 0);
	HAL_NVIC_EnableIRQ(DMA2_Channel4_5_IRQn);
}
//DMA接收配置
//这里的传输形式是固定的,这点要根据不同的情况来修改
//从外设->存储器模式/8位数据宽度/存储器增量模式
//DMA_CHx:DMA通道CHx
//cpar:外设地址
//cmar:存储器地址
//cndtr:数据传输量
//循环传输，使用循环缓存，不使用dma中断，以idle中断确定一帧数据
void dma_rx_init(DMA_Channel_TypeDef *DMA_CHx,u32 cpar,u32 cmar,u16 cndtr)
{
	DMA_CHx->CCR=0X00000000;	//复位
	DMA_CHx->CPAR=cpar; 	 	//DMA1 外设地址 
	DMA_CHx->CMAR=cmar; 		//DMA1,存储器地址
	DMA_CHx->CNDTR=cndtr;    	//DMA1,传输数据量
	DMA_CHx->CCR|=0<<4;  		//从外设读
	DMA_CHx->CCR|=1<<5;  		//执行循环
	DMA_CHx->CCR|=0<<6; 		//外设地址非增量模式
	DMA_CHx->CCR|=1<<7; 	 	//存储器增量模式
	DMA_CHx->CCR|=0<<8; 	 	//外设数据宽度为8位
	DMA_CHx->CCR|=0<<10; 		//存储器数据宽度8位
	DMA_CHx->CCR|=1<<12; 		//中等优先级
	DMA_CHx->CCR|=0<<14; 		//非存储器到存储器模式	
	DMA_CHx->CCR|=1<<0;			//开启DMA传输
}

void dma_tx(DMA_Channel_TypeDef *DMA_CHx,u32 cpar,u32 cmar,u16 cndtr)
{
	DMA_CHx->CCR=0X00000000;	//复位
	DMA_CHx->CPAR=cpar; 	 	//DMA1 外设地址 
	DMA_CHx->CMAR=cmar; 		//DMA1,存储器地址
	DMA_CHx->CNDTR=cndtr;    	//DMA1,传输数据量
	DMA_CHx->CCR|=1<<4;  		//从存储器读
	DMA_CHx->CCR|=0<<5;  		//普通模式
	DMA_CHx->CCR|=0<<6; 		//外设地址非增量模式
	DMA_CHx->CCR|=1<<7; 	 	//存储器增量模式
	DMA_CHx->CCR|=0<<8; 	 	//外设数据宽度为8位
	DMA_CHx->CCR|=0<<10; 		//存储器数据宽度8位
	DMA_CHx->CCR|=1<<12; 		//中等优先级
	DMA_CHx->CCR|=0<<14; 		//非存储器到存储器模式	
	DMA_CHx->CCR|=1<<1; 		//允许传输完成中断
	DMA_CHx->CCR|=1<<0;			//开启DMA传输
} 

/*
由串口发送队列调用
n取值0-3，对应串口1-4
*/
void dma_uart_tx(u8 n,u16 len)
{
	switch(n){
		case 0:{
			dma_tx(hdma_usart1_tx.Instance,(uint32_t)&huart1.Instance->DR,(u32)mUart[0].txdata,len);	//开始发送
		}break;
		case 1:{
			dma_tx(hdma_usart2_tx.Instance,(uint32_t)&huart2.Instance->DR,(u32)mUart[1].txdata,len);	//开始发送
		}break;
		case 2:{
			dma_tx(hdma_usart3_tx.Instance,(uint32_t)&huart3.Instance->DR,(u32)mUart[2].txdata,len);	//开始发送
		}break;
		case 3:{
			dma_tx(hdma_uart4_tx.Instance,(uint32_t)&huart4.Instance->DR,(u32)mUart[3].txdata,len);	//开始发送
		}break;
		default:{
		}break;
	}
}



